package tech.aistar.day13;

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * 本类用来演示: 反射操作数组
 *
 * @author: success
 * @date: 2022/8/4 1:31 下午
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr ={1,2,3};

        String[] arr2 = {"java","mysql"};

        //写一个程序,可以对上面俩个数组都能进行扩容操作.

        Object newArr = extendsArr(arr);
        print(newArr);

        System.out.println("======");

        Object newArr2 = extendsArr(arr2);
        print(newArr2);

    }

    //扩容 - 反射创建数组
    private static Object extendsArr(Object arr) {
        //1. 创建数组的必可不少俩个条件 - 元素类型,数组长度
        //假设就扩容一个
        int len = Array.getLength(arr);

        //2. 获取数组的元素类型 - 组件类型
        Class<?> type = arr.getClass().getComponentType();

        //3. 新的数组
        Object newArr = Array.newInstance(type,len+1);

        //4. 数组的赋值
        //将原来数组arr中的数据复制到新的数组newArr中.
        //遍历原来的数组
        for (int i = 0; i < len; i++) {
            Object o = Array.get(arr,i);
            //设置到哪个数组的哪个位置
            Array.set(newArr,i,o);
        }
        return newArr;
    }

    //反射遍历数组
    private static void print(Object arr) {
        //简单的api方法
        //1. 反射获取数组的长度
        int len = Array.getLength(arr);
       // System.out.println(len);

        //2. 反射根据下标获取数组中的元素
        for (int i = 0; i < len; i++) {
            Object o = Array.get(arr,i);
            System.out.println(o);
        }
    }
}
